home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 55375 / 55375.xpi / chrome / chromeFiles / content / bindings / btfeedreader2.xml < prev    next >
Encoding:
Extensible Markup Language  |  2009-11-15  |  12.6 KB  |  371 lines

  1. <?xml version="1.0"?>
  2.  
  3. <bindings id="feedreaderBindings"
  4.       xmlns="http://www.mozilla.org/xbl"
  5.       xmlns:html="http://www.w3.org/1999/xhtml"
  6.       xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  7.       xmlns:xbl="http://www.mozilla.org/xbl">
  8.  
  9.   <binding id="feedreader" extends="xul:box">
  10.     <content>
  11.       <xul:toolbaritem id="feedreader" flex="1">
  12.         <xul:image id="feedreader-left-cap"/>
  13.         <xul:button tooltiptext="Toggle News Sidebar" id="feedreader-sidebar-toggle" oncommand="toggleFeedSidebar()"/>
  14.         <xul:button tooltiptext="Reload Feed" id="feedreader-reload" xbl:inherits="hidden=hidereloadbutton" oncommand="readFeed()"/>
  15.         <xul:button tooltiptext="Previous Item" id="feedreader-previous" oncommand="previousFeedItem()"/>
  16.         <xul:button tooltiptext="Next Item" id="feedreader-next" oncommand="nextFeedItem()"/>
  17.         <xul:hbox id="feedreader-textbox" disabled="true" xbl:inherits="width" flex="1">
  18.           <xul:toolbarbutton label="Loading..." crop="end" pack="start" anonid="feedreader-item" flex="1" type="menu-button">
  19.             <xul:menupopup position="after_end" id="feedreader-select-popup" anonid="feedreader-select-popup">
  20.             </xul:menupopup>
  21.           </xul:toolbarbutton>
  22.         </xul:hbox>
  23.         <xul:image id="feedreader-right-cap" />
  24.       </xul:toolbaritem>
  25.       <children includes="btfeed" />
  26.     </content>
  27.     <handlers>
  28.       <handler event="command">
  29.         <![CDATA[
  30.         if (event.originalTarget.hasAttribute("bt-url")) {
  31.           var subject = {};
  32.           subject.wrappedJSObject = this.brandObject;
  33.           this.observerService.notifyObservers(subject, "brandthunder", this.id);
  34.           this.brandObject.utilities.openLink(this.brandObject, event, event.originalTarget.getAttribute("bt-url"));
  35.         } else if (event.originalTarget.hasAttribute("bt-feed")) {
  36.           this.currentfeed = event.originalTarget.getAttribute("bt-feed");
  37.           this.readFeed(event.originalTarget.getAttribute("bt-feed"));
  38.           var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
  39.             this.btPrefBranch.setCharPref(currentBoom + ".currentfeed", this.currentfeed);
  40.         }
  41.         ]]>
  42.       </handler>
  43.       <handler event="popupshowing">
  44.         <![CDATA[
  45.         if (event.originalTarget.getAttribute("anonid") == "feedreader-select-popup") {
  46.           for (let i= event.originalTarget.childNodes.length - 1; i >= 0; i--) {
  47.             if (event.originalTarget.childNodes.item(i).getAttribute("bt-feed") == this.currentfeed) {
  48.               event.originalTarget.childNodes.item(i).setAttribute("checked", "true");
  49.             } else {
  50.               event.originalTarget.childNodes.item(i).removeAttribute("checked");
  51.             }
  52.           }
  53.         }
  54.         ]]>
  55.       </handler>
  56.     </handlers>
  57.     <implementation>
  58.       <constructor>
  59.         <![CDATA[
  60.         if (this.childNodes.length) {
  61.           this.currentfeed = this.childNodes[0].getAttribute('src');
  62.         } else if (this.hasAttribute("feed")) {
  63.           this.currentfeed = this.getAttribute("feed");;
  64.         } else {
  65.           return;
  66.         }
  67.         if (this.childNodes.length > 1) {
  68.           var menupopup = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-select-popup");
  69.           for (var i=0; i < this.childNodes.length; i++) {
  70.             if (this.childNodes[i].hasAttribute("src") && this.childNodes[i].hasAttribute("title")) {
  71.               var menuitem = document.createElement("menuitem");
  72.                 menuitem.setAttribute("label", childNodes[i].getAttribute("title"));
  73.                 menuitem.setAttribute("bt-feed", childNodes[i].getAttribute("src"));
  74.               menuitem.setAttribute("type", "checkbox");
  75.                 menupopup.appendChild(menuitem);
  76.             }
  77.           }
  78.         } else {
  79.           var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
  80.           feedReaderItemButton.removeAttribute("type");
  81.         }
  82.  
  83.  
  84.         this.observerService = Components.classes["@mozilla.org/observer-service;1"]
  85.                                          .getService(Components.interfaces.nsIObserverService)
  86.  
  87.         if (this.hasAttribute('brand')) {
  88.           this.brandObject = BrandThunder.clients[this.getAttribute('brand')];
  89.         }
  90.           this.btPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]
  91.                                    .getService(Components.interfaces.nsIPrefService)
  92.                                     .getBranch("extensions.brandthunder.");
  93.         try {
  94.           var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
  95.           this.currentfeed = this.btPrefBranch.getCharPref(currentBoom + ".currentfeed" );
  96.         } catch(ex) {}
  97.         
  98.  
  99.         if (this.hasAttribute('numitems')) {
  100.           this.numitems = this.getAttribute('numitems');
  101.         }
  102.         if (this.hasAttribute('rotationdelay')) {
  103.           this.rotationdelay = this.getAttribute('rotationdelay') * 1000;
  104.         }
  105.         if (this.hasAttribute('sidebar')) {
  106.           this.sidebarID = this.getAttribute('sidebar');
  107.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('observes', this.sidebarID);
  108.         } else {
  109.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('hidden', true);
  110.         }
  111.  
  112.         this.readFeed();
  113.         function reloadFeed(feedreader) {
  114.           return function() {
  115.             feedreader.readFeed(feedreader.currentfeed, feedreader);
  116.           }
  117.         }
  118.         this.reloadTimer = window.setInterval(reloadFeed(this), this.reloaddelay);
  119.         ]]>
  120.       </constructor>
  121.       <destructor>
  122.           window.clearInterval(this.rotationTimer);
  123.           window.clearInterval(this.reloadTimer);
  124.       </destructor>
  125.       <field name="currentfeed"/>
  126.       <field name="feedItems">
  127.         [];
  128.       </field>
  129.       <field name="numitems">
  130.         -1;
  131.       </field>
  132.       <field name="feedIndex">
  133.         0;
  134.       </field>
  135.       <field name="selectedIndex">
  136.         0;
  137.       </field>
  138.       <field name="rotationdelay">
  139.         5000;
  140.       </field>
  141.       <field name="reloaddelay">
  142.         1800000;
  143.       </field>
  144.       <field name="itemtitleprefix">
  145.         "";
  146.       </field>
  147.       <field name="itemurlprefix">
  148.         "";
  149.       </field>
  150.       <field name="currentFeedItem">
  151.       0
  152.       </field>
  153.       <field name="rssdeckElement">
  154.         document.getAnonymousElementByAttribute(this, 'id', 'feedreader-deck');
  155.       </field>
  156.       <field name="rotationTimer">
  157.       </field>
  158.       <field name="reloadTimer">
  159.       </field>
  160.       <field name="readSrcTimer">
  161.       </field>
  162.       <field name="sidebarID">
  163.         ""
  164.       </field>
  165.       <field name="brandObject"/>
  166.       <field name="btClientBranch"/>
  167.       <field name="observerService"/>
  168.  
  169.  
  170.       <method name="toggleFeedSidebar">
  171.         <body>
  172.           <![CDATA[
  173.           if (this.sidebarID) {
  174.             toggleSidebar(this.sidebarID);
  175.           }
  176.           ]]>
  177.         </body>
  178.       </method>
  179.  
  180.       <method name="startFeedRotation">
  181.         <body>
  182.           <![CDATA[
  183.           function advance(feedreader) {
  184.             return function() {
  185.               feedreader.nextFeedItem();
  186.             }
  187.           }
  188.           this.rotationTimer = window.setInterval(advance(this), this.rotationdelay);
  189.           ]]>
  190.         </body>
  191.       </method>
  192.  
  193.       <method name="updateFeedItem">
  194.         <body>
  195.           <![CDATA[
  196.           if (this.feedItems == 0) {
  197.             return;
  198.           }
  199.           var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
  200.           feedReaderItemButton.setAttribute("label", this.feedItems[this.currentFeedItem].title);
  201.           feedReaderItemButton.setAttribute("tooltiptext", this.feedItems[this.currentFeedItem].title);
  202.           if (this.childNodes.length > 1) {
  203.             document.getAnonymousElementByAttribute(feedReaderItemButton, "anonid", "button").setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
  204.           } else {
  205.             feedReaderItemButton.setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
  206.           }
  207.           ]]>
  208.         </body>
  209.       </method>
  210.  
  211.  
  212.       <method name="previousFeedItem">
  213.         <body>
  214.           <![CDATA[
  215.           var numItems;
  216.           if (this.numitems > -1) {
  217.             numItems = this.numitems;
  218.           } else {
  219.             numItems = this.feedItems.length;
  220.           }
  221.           this.currentFeedItem--;
  222.           if (this.currentFeedItem < 0) {
  223.             this.currentFeedItem = numItems-1;
  224.           }
  225.           this.updateFeedItem();
  226.           ]]>
  227.         </body>
  228.       </method>
  229.  
  230.       
  231.  
  232.       <method name="nextFeedItem">
  233.         <body>
  234.           <![CDATA[
  235.           var numItems;
  236.           if (this.numitems > -1) {
  237.             numItems = this.numitems;
  238.           } else {
  239.             numItems = this.feedItems.length;
  240.           }
  241.           this.currentFeedItem++;
  242.           if (this.currentFeedItem >= numItems) {
  243.             this.currentFeedItem = 0;
  244.           }
  245.           this.updateFeedItem();
  246.           ]]>
  247.         </body>
  248.       </method>
  249.       <method name="readFeed">
  250.         <parameter name="feed" />
  251.         <parameter name="feedreader" />
  252.         <body>
  253.           if (!feedreader) {
  254.             feedreader = this;
  255.           }
  256.           <![CDATA[
  257.           if (!feed) {
  258.             feed = feedreader.currentfeed;
  259.           }
  260.           feedreader.feedItems = [];
  261.  
  262.           var xhr = new XMLHttpRequest();
  263.           xhr.open('GET', feed, true);
  264.           xhr.onload = function() {
  265.             feedreader.parseFeed(xhr.responseText);
  266.           }
  267.           xhr.send(null);
  268.           ]]>
  269.         </body>
  270.       </method>
  271.       <method name="parseFeed">
  272.         <parameter name="xml" />
  273.         <body>
  274.           <![CDATA[
  275.           var parser = new DOMParser();
  276.           var dom = parser.parseFromString(xml, 'text/xml');
  277.  
  278.           // check for error
  279.           if (dom.documentElement.nodeName == 'parsererror')
  280.             throw new Error('Could not parse feed');
  281.  
  282.           var xmlDoc = dom.documentElement;
  283.           switch (xmlDoc.nodeName.toLowerCase()) {
  284.             case 'feed':    this.parseAtom(xmlDoc); break;
  285.             case 'rdf:rdf': this.parseRss(xmlDoc); break;
  286.             case 'rss':     this.parseRss(xmlDoc); break;
  287.           }
  288.           if (this.feedItems.length > 0) {
  289.             this.currentFeedItem = 0;
  290.             this.updateFeedItem();
  291. //            this.startFeedRotation();
  292.           } else {
  293.             var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
  294.               feedReaderItemButton.setAttribute("label", "No Feed Items");
  295.           }
  296.  
  297.           ]]>
  298.         </body>
  299.       </method>
  300.       <method name="parseAtom">
  301.         <parameter name="xmlDoc" />
  302.         <body>
  303.           <![CDATA[
  304.             var entries = xmlDoc.getElementsByTagName('entry');
  305.             for (var i = 0; i < entries.length; i++) {
  306.               this.feedItems[i] = ['title', 'url'];
  307.  
  308.               //load the entry title
  309.               this.feedItems[i]['title'] = entries[i].getElementsByTagName('title')[0].firstChild.nodeValue;
  310.  
  311.               //if <id> is an absolute URL, use that
  312.               var elem = entries[i].getElementsByTagName('id');
  313.               for (var j = 0; j < elem.length; j++) {
  314.                 var kids = elem[j].childNodes;
  315.                 if (kids.length > 0) {
  316.                   var val = kids[0].nodeValue;
  317.                   if (val != null && val.match(/^http:\/\//)) {
  318.                     this.feedItems[i]['url'] = val;
  319.                     break;
  320.                   }
  321.                 }
  322.               }
  323.  
  324.  
  325.               //instead look for a <link> tag
  326.               if (this.feedItems[i]['url'] == null) {
  327.                 var elem = entries[i].getElementsByTagName('link');
  328.                 for (var j = 0; j < elem.length; j++) {
  329.                   var rel = elem[j].getAttribute('rel');
  330.                   if (rel == null || rel == 'alternate') {
  331.                     this.feedItems[i]['url'] = elem[j].getAttribute('href');
  332.                     break;
  333.                   }
  334.                 }
  335.               }
  336.  
  337.               if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
  338.                 throw new Error('Invalid feed');
  339.             }
  340.  
  341.           ]]>
  342.         </body>
  343.       </method>
  344.       <method name="parseRss">
  345.         <parameter name="xmlDoc" />
  346.         <body>
  347.           <![CDATA[
  348.           var items = xmlDoc.getElementsByTagName('item');
  349.           for (var i = 0; i < items.length; i++) {
  350.             this.feedItems[i] = ['title', 'url'];
  351.  
  352.             var titleElem = items[i].getElementsByTagName('title');
  353.             if (titleElem.length > 0)
  354.               this.feedItems[i]['title'] = titleElem[0].textContent;
  355.  
  356.             var linkElem = items[i].getElementsByTagName('link');
  357.             if (linkElem.length > 0)
  358.               this.feedItems[i]['url'] = linkElem[0].textContent;
  359.  
  360.             if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
  361.               throw new Error('Invalid feed');
  362.           }
  363.           ]]>
  364.         </body>
  365.       </method>
  366.     </implementation>
  367.   </binding>
  368.  
  369.   <binding id="feed"></binding>
  370. </bindings>
  371.